06. 编写阶段统计信息

编写阶段统计信息

在对强化学习解决方案进行迭代时,有必要衡量智能体的效果。最简单的跟踪指标是在每个阶段获取的总奖励(正如在示例智能体中所演示的那样)。

将这些(以及其他)统计信息保存到文件中会有帮助,以供以后分析。例如,阶段奖励逐渐增加表明智能体在学习。

一种方法是使用 Pandas 将阶段统计信息记录到 CSV 文件中。首先,在智能体的 __init__() 方法中初始化一些变量:

import os
import pandas as pd
from quad_controller_rl import util

class MyAgent(BaseAgent):
    ...
    def __init__(self, task):
        ...
        # Save episode stats
        self.stats_filename = os.path.join(
            util.get_param('out'),
            "stats_{}.csv".format(util.get_timestamp()))  # path to CSV file
        self.stats_columns = ['episode', 'total_reward']  # specify columns to save
        self.episode_num = 1
        print("Saving stats {} to {}".format(self.stats_columns, self.stats_filename))  # [debug]

这里,我们可以使用实用函数 util.get_param('out') 获取目标输出目录。默认目录是 quad_controller_rl/out/ ,但是你在调用 roslaunch 时可以自己指定目录:

roslaunch quad_controller_rl rl_controller.launch out:=<complete path>

然后定义一个辅助函数来写入 CSV 文件:

    def write_stats(self, stats):
        """Write single episode stats to CSV file."""
        df_stats = pd.DataFrame([stats], columns=self.stats_columns)  # single-row dataframe
        df_stats.to_csv(self.stats_filename, mode='a', index=False,
            header=not os.path.isfile(self.stats_filename))  # write header first time only

然后在每个阶段结束时从 step() 调用它:

        ...
        if done:
            # Write episode stats
            self.write_stats([self.episode_num, self.total_reward])
            self.episode_num += 1

绘制阶段统计信息

运行完毕后(你可以随时在终端内按下 Ctrl+C 键结束运行),可以轻松地将 CSV 文件加载到 Pandas 中进行绘制。

import pandas as pd

df_stats = pd.read_csv(<CSV filename>)
df_stats[['total_reward']].plot(title="Episode Rewards")

提示 :如果你位于 catkin 工作区 ( ~/catkin_ws/ ),运行 devel/setup.bash 以将项目代码包含在当前 PYTHONPATH 中。然后,你可以从该项目中导入模块,例如, util.py 中有一个便利函数可以用来绘制阶段奖励(或者 CSV 文件中的任何统计信息):

from quad_controller_rl import util
util.plot_stats(<CSV filename>, title="Episode Rewards")